from django.shortcuts import render,redirect,HttpResponse
from django.core.exceptions import ValidationError
from django import forms

from app03 import models
from app03.utils.pegination import Pegination
from app03.utils.encrypt import md5
from app03.utils.bootrsap import BootrsapModelForm


def admin_list(request):
    # 管理员列表

    #搜索
    data_seach={}
    seach_list=request.GET.get('q','')
    if seach_list:
        data_seach['user_n']=seach_list

    # 检查用户是否已登录，已登录，继续先下去，未登录，跳转回登录页面
    # 用户发来请求，获取cookie字符串，拿着随机字符串在session中查看有没有
    # info = request.session.get( 'info' )
    # if not info:
    #     return redirect('/login/')

    # 从数据库中获取数据
    dict_list=models.Admins.objects.filter(**data_seach)

    # 分页
    page_object = Pegination(request,dict_list)

    context={
        'dict_list':page_object.page_mun,
        'page_string':page_object.html(),
        'seach_list':seach_list,
    }
    return render(request,'admin_list.html',context)

#新建管理员
#创建一个管理员form表单类
class AdminModelForm(BootrsapModelForm):
    bootrsap_exitis_forms = ['img']
    #创建一个字段
    create_password=forms.CharField(
        label='确认密码',
        widget=forms.PasswordInput(render_value=True)
    )

    class Meta:
        model =models.Admins
        fields='__all__'
        widgets={
            'password':forms.PasswordInput(render_value=True)
        }
    # 给密码加密
    def clean_password(self):
        pwd=self.cleaned_data.get('password')
        return md5(pwd)
    #再定义一个钩子函数 用于验证密码
    def clean_create_password(self):
        #获取验证通过 用户输入的确认密码
        comstf=md5(self.cleaned_data.get('create_password'))
        #获取用户输入的密码
        pwd =self.cleaned_data.get('password')
        if comstf != pwd:
            raise ValidationError('密码输入不一致')
        # 将com_password的值 返回给cleaned_data  在通过form.save()保存到数据库中
        return comstf

def admin_add(request):
    #添加管理员
    title='新建管理员'
    if request.method=='GET':
        form =AdminModelForm()
        return render(request,'admin_add.html',{'title':title,'form':form})
    form=AdminModelForm(data=request.POST,files=request.FILES)
    # print(form)
    if form.is_valid():
        form.save()
        return redirect('/admin/list')
    return render(request,'admin_add.html', {'title': title, 'form': form})

#编辑管理员
#创建一个管理员modelForm表单类
class AdminEditModelForm(BootrsapModelForm):
    class Meta:
        model =models.Admins
        fields=['user_n']

def admin_edit(request,nid):
    title='编辑管理员'
    #根据id获取到对应哪一行数据
    row_object=models.Admins.objects.filter(id=nid).first()
    # 判断id 是否为空
    if not row_object:
        return redirect('/admin/list/')
    if request.method=='GET':
        form = AdminEditModelForm(instance=row_object)
        return render(request,'change.html',{'title': title, 'form':form})
    form=AdminEditModelForm(data=request.POST,instance=row_object)
    if form.is_valid():
        form.save()
        return redirect('/admin/list/')
    return render(request,'change.html', {'title': title, 'form': form})

#删除管理员
def admin_delete(request,nid):
    models.Admins.objects.filter(id=nid).delete()
    return redirect('/admin/list/')

#重置密码
#创建一个重置密码的modelForm类
class AdminClearModelForm(BootrsapModelForm):
    #创建一个字段
    create_password=forms.CharField(
        label='确认密码',
        widget=forms.PasswordInput(render_value=True)
    )
    class Meta:
        model =models.Admins
        fields=['password','create_password']
        widgets={
            'password':forms.PasswordInput(render_value=True)
        }
    # 给密码加密
    def clean_password(self):
        pwd=self.cleaned_data.get('password')
        #去数据库中校验当前密码与输入的密码是否一致   exists() true/false
        exitis=models.Admins.objects.filter(id=self.instance.pk,password=pwd).exists()
        if exitis:
            raise  ValidationError('输入的密码不能与原密码相同')

        return md5(pwd)
    #再定义一个钩子函数 用于验证密码
    def clean_create_password(self):
        #获取验证通过 用户输入的确认密码
        comstf=md5(self.cleaned_data.get('create_password'))
        #获取用户输入的密码
        pwd =self.cleaned_data.get('password')
        if comstf != pwd:
            raise ValidationError('密码输入不一致')
        # 将com_password的值 返回给cleaned_data  在通过form.save()保存到数据库中
        return comstf
def admin_clear(request,nid):
    # 对象/none
    row_dict=models.Admins.objects.filter(id=nid).first()
    # 判断id是否为空
    if not row_dict:
        return redirect('/admin/list/')
    title='重置密码--{}'.format(row_dict.user_n)
    if request.method=='GET':
        form=AdminClearModelForm()
        return render(request,'change.html',{'title':title,'form':form})
    form=AdminClearModelForm(data=request.POST,instance=row_dict)
    if form.is_valid():
        form.save()
        return redirect('/admin/list/')
    return render( request, 'change.html', {'title': title, 'form': form} )